#include<iostream>
#include<fstream>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>

using namespace :: std;

int main(){
    string fileName, cmp;
    unsigned cantNodos, cantArcos;
    float adyacencia;
    unsigned nodoA, nodoB;
        
    do{
        cout << "Nombre archivo IN: " << endl;
        cin >> fileName;
    }while(fileName.size() < 3);
    
    cmp = fileName.substr( fileName.size() - 3 );                
        if( cmp.compare(".in") )
            fileName +=  ".in";

    do{
        cout << "Cantidad de nodos: " << endl;
        cin >> cantNodos;
    }while(cantNodos <= 0);
        
    do{
        cout << "Porcentaje de adyacencia (sin %): " << endl;
        cin >> adyacencia;
    }while(adyacencia < 1 || adyacencia > 100);

    
    /* Creo una matriz de adyacencia con un vector de vectores.
     * Como el problema de coloreo solo se aplica a grafos no
     * dirigidos, la matriz de adyacencia es simétrica, por lo
     * que solo necesito el triangulo superior o inferior de la
     * matriz para analizarla. En este caso tomo el triangulo
     * inferior.
     */
    
    vector< vector<bool> > matAdy;
    
    //Esto es para no tener problemas con los indices.
    {
        vector<bool> filaAdyacenciaNula ( 0 );
        matAdy.push_back(filaAdyacenciaNula);
        matAdy.push_back(filaAdyacenciaNula);
    }
    
    for ( unsigned i = 1 ; i <= cantNodos ; i++){
        vector<bool> filaAdyacencia ( i + 1, false );
        matAdy.push_back(filaAdyacencia);
    }
    
    
    //ceil() redondea siempre al superior 1.1 -> 2.
    cantArcos = (int) ceil( cantNodos * (cantNodos - 1) / 2 * (adyacencia / 100));

    ofstream archivoOUT(fileName.c_str());

    archivoOUT << cantNodos << endl;
    archivoOUT << cantArcos << endl;

    srand(time(NULL));
    
    for(unsigned i = 0; i < cantArcos; i++){
        do{
            nodoA = rand() % (cantNodos - 1) + 2;
            /*Necesito que B sea menor que A porque tengo la matriz
              triangular inferior. */
            nodoB = rand() % (nodoA - 1) + 1;

        }while(matAdy[nodoA][nodoB] == true);
        
        matAdy[nodoA][nodoB] = true;
                
        archivoOUT << nodoA << " " << nodoB << endl;
    }
    
    return 0;
}